Role-Based Access Control (RBAC) একটি নিরাপত্তা কৌশল, যেখানে ব্যবহারকারীদের নির্দিষ্ট ভূমিকা (Role) দেওয়া হয় এবং সেই অনুযায়ী তাদের অ্যাপ্লিকেশনের বিভিন্ন অংশে অ্যাক্সেস নিয়ন্ত্রণ করা হয়। Next.js এ RBAC সেটআপ করার জন্য, আপনাকে Auth (Authentication) এবং Authorization (অথরাইজেশন) মেকানিজম প্রয়োগ করতে হবে।
RBAC ব্যবহার করে আপনি বিভিন্ন ইউজারের জন্য বিভিন্ন রোল নির্ধারণ করতে পারবেন এবং সেই অনুযায়ী তাদের অ্যাক্সেস প্রিভিলিজ কাস্টমাইজ করতে পারবেন।
এই টিউটোরিয়ালে আমরা দেখব কীভাবে Next.js এ RBAC কার্যকরভাবে ব্যবহার করা যায়।
১. Authentication (অথেনটিকেশন) ও Authorization (অথরাইজেশন) এর ভূমিকা
- Authentication (অথেনটিকেশন): এটি ব্যবহারকারীর পরিচয় যাচাই করে। যেমন, ইউজারের লগইন ডিটেইলস (ইউজারনেম এবং পাসওয়ার্ড) যাচাই করা।
- Authorization (অথরাইজেশন): এটি ব্যবহারকারীকে নির্দিষ্ট রিসোর্স বা অ্যাপ্লিকেশনের অংশে অ্যাক্সেস দেওয়ার সিদ্ধান্ত নেয়। RBAC ব্যবহারের মাধ্যমে বিভিন্ন রোলের জন্য আলাদা আলাদা অ্যাক্সেস সুবিধা নির্ধারণ করা হয়।
২. RBAC বাস্তবায়ন এর জন্য প্রস্তুতি
Next.js এ RBAC বাস্তবায়ন করার জন্য প্রথমে আপনাকে একটি অথেনটিকেশন ব্যবস্থা তৈরি করতে হবে, যেটি ইউজারের রোল সংরক্ষণ করবে। আমরা এখানে একটি সাধারণ উদাহরণ হিসেবে JWT (JSON Web Tokens) ব্যবহার করব।
প্রয়োজনীয় প্যাকেজ ইনস্টল করা:
npm install jsonwebtoken cookie
- jsonwebtoken: JWT টোকেন তৈরি এবং যাচাই করার জন্য ব্যবহৃত হবে।
- cookie: ব্রাউজারে কুকি সেট ও পার্স করার জন্য ব্যবহৃত হবে।
৩. Authentication (লগইন) সিস্টেম তৈরি করা
প্রথমে, আমাদের একটি লগইন সিস্টেম তৈরি করতে হবে, যেখানে ইউজারের রোল নির্ধারণ করা হবে এবং সেই রোলটি JWT টোকেনের মধ্যে সংরক্ষণ করা হবে।
লগইন API উদাহরণ:
// pages/api/login.js
import jwt from 'jsonwebtoken';
import cookie from 'cookie';
const SECRET_KEY = 'your-secret-key'; // এটি সিক্রেট কী হিসেবে ব্যবহার হবে
export default function handler(req, res) {
if (req.method === 'POST') {
const { username, password } = req.body;
// ইউজারের রোল ডিফাইন করা (এটা সাধারণত ডাটাবেস থেকে আসবে)
const user = {
username: 'admin',
password: 'admin123',
role: 'admin', // ইউজারের রোল 'admin' হিসাবে সন্নিবেশিত
};
// পাসওয়ার্ড যাচাই (এখানে কেবল উদাহরণ)
if (username === user.username && password === user.password) {
const token = jwt.sign({ username: user.username, role: user.role }, SECRET_KEY, { expiresIn: '1h' });
// JWT কুকি সেট করা
res.setHeader('Set-Cookie', cookie.serialize('auth_token', token, {
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
maxAge: 60 * 60,
path: '/',
}));
return res.status(200).json({ message: 'Login successful' });
} else {
return res.status(401).json({ message: 'Invalid credentials' });
}
} else {
return res.status(405).json({ message: 'Method not allowed' });
}
}
ব্যাখ্যা:
- আমরা একটি
POSTরিকোয়েস্টের মাধ্যমে ইউজারের লগইন তথ্য যাচাই করেছি। - যদি ইউজার সঠিক তথ্য প্রদান করে, তবে একটি JWT টোকেন তৈরি করা হয়, যা ইউজারের রোলও ধারণ করে।
- JWT কুকি হিসেবে ব্রাউজারে সেট করা হয়।
৪. Authorization (অথরাইজেশন) এর মাধ্যমে RBAC বাস্তবায়ন
RBAC কার্যকর করতে, আপনার অ্যাপের বিভিন্ন অংশে ইউজারের রোল অনুসারে অ্যাক্সেস নিয়ন্ত্রণ করতে হবে। Next.js এ আপনি getServerSideProps অথবা getInitialProps ব্যবহার করে রোল চেক করতে পারেন।
Role-Based Access Control উদাহরণ:
// pages/admin.js
import jwt from 'jsonwebtoken';
import cookie from 'cookie';
const SECRET_KEY = 'your-secret-key';
export async function getServerSideProps({ req }) {
const cookies = cookie.parse(req.headers.cookie || '');
const token = cookies.auth_token || '';
try {
// JWT টোকেন যাচাই
const decoded = jwt.verify(token, SECRET_KEY);
// রোল চেক করা
if (decoded.role !== 'admin') {
return {
redirect: {
destination: '/unauthorized', // Unauthorized পেজে রিডিরেক্ট করা
permanent: false,
},
};
}
// রোল 'admin' হলে অ্যাডমিন পেজ রেন্ডার করা
return { props: { user: decoded } };
} catch (error) {
return {
redirect: {
destination: '/login',
permanent: false,
},
};
}
}
const AdminPage = ({ user }) => {
return (
<div>
<h1>Welcome, {user.username}</h1>
<p>This is the admin page.</p>
</div>
);
}
export default AdminPage;
ব্যাখ্যা:
getServerSidePropsএর মাধ্যমে আমরা কুকি থেকে JWT টোকেন পড়ছি এবং সেটি যাচাই করছি।- যদি টোকেন বৈধ হয় এবং ইউজারের রোল
'admin'হয়, তবে অ্যাডমিন পেজ রেন্ডার হবে। যদি না হয়, তবে ইউজারকে/unauthorizedঅথবা/loginপেজে রিডিরেক্ট করা হবে।
৫. Unauthorized পেজ তৈরি করা
// pages/unauthorized.js
const Unauthorized = () => {
return (
<div>
<h1>Unauthorized Access</h1>
<p>You do not have permission to access this page.</p>
</div>
);
}
export default Unauthorized;
৬. Logout ফাংশন তৈরি করা
আপনি একটি লগআউট ফাংশনও তৈরি করতে পারেন, যা JWT টোকেন কুকি থেকে রিমুভ করে দেয়।
// pages/api/logout.js
import cookie from 'cookie';
export default function handler(req, res) {
res.setHeader('Set-Cookie', cookie.serialize('auth_token', '', {
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
expires: new Date(0),
path: '/',
}));
res.status(200).json({ message: 'Logged out successfully' });
}
সারাংশ
Next.js এ RBAC (Role-Based Access Control) কার্যকর করতে আপনাকে একটি অথেনটিকেশন সিস্টেম তৈরি করতে হবে, যা JWT টোকেন ব্যবহার করবে। আপনি getServerSideProps বা getInitialProps এর মাধ্যমে ইউজারের রোল যাচাই করতে পারেন এবং রোল অনুযায়ী অ্যাক্সেস নিয়ন্ত্রণ করতে পারবেন। এই প্রক্রিয়ায়, অ্যাডমিন, ইউজার, গেস্ট ইত্যাদি বিভিন্ন রোলের জন্য নির্দিষ্ট পেজ এবং ফিচারের অ্যাক্সেস কাস্টমাইজ করা সম্ভব।
Read more